//导入get请求，因为这是在js里面，如果在vue组件里面可以直接调用，就不用导入进来
import {getRequest} from "./api";
import Home from "../views/Home";



//定义初始化菜单方法
export const initMenu = (router, store) => {
    //如果vuex中放的菜单不是空的，在初始化，如果有数据了说明不用初始化浪费性能
    if (store.state.routes.length > 0) {
        return null;
    }
    //请求的后端接口，then 是后端返回的数据
    getRequest('/system/cfg/menu').then(data => {
        if (data) {
            //调用写好的 formatRoutes 格式化方法，格式化 router
            let fmtRoutes = formatRoutes(data);
            // console.log(fmtRoutes)
            //添加到 router
            router.addRoutes(fmtRoutes);
            //将数据存入vuex
            store.commit('initRoutes', fmtRoutes);
        }
    })

}

//格式化 component 组件，将数据库路径下的 component 字段字符串，格式化成对象(.vue组件)
export const formatRoutes = (data) => {
    //1.定义一个数组
    let fmtRoutes = [];
    //2.遍历接口返回的数据，是一个菜单数组(集合)
    if (data) {//判断data是一个数组，在未知是否为数组的时候无法遍历
        data.forEach(router => {
            //格式化，遍历出来的每一个 router 对象
            let {
                path,
                name,
                iconCls,
                children,
                component,
            } = router;
            //判断 children 存在并且是数组类型时
            if (children && children instanceof Array) {
                //递归，应为children本身也是个路由而已，子菜单
                children = formatRoutes();//用 children 继续调用本身的格式化方法，如果有子菜单，可以将子菜单也全部格式话
            }
            //将从数据库遍历出来的菜单数据，格式化并赋值成vue组件
            let fmRouter = {
                path:path,
                name:name,
                iconCls:iconCls,
                children:children,
                component(resolve){
                    if (component.startsWith('Home')) {
                        require(['../views/' + component + '.vue'], resolve);
                    } else if (component.startsWith('Emp')) {
                        require(['../views/emp/' + component + '.vue'], resolve);
                    } else if (component.startsWith('Per')) {
                        require(['../views/per/' + component + '.vue'], resolve);
                    } else if (component.startsWith('Sal')) {
                        require(['../views/sal/' + component + '.vue'], resolve);
                    } else if (component.startsWith('Sta')) {
                        require(['../views/sta/' + component + '.vue'], resolve);
                    } else if (component.startsWith('Sys')) {
                        require(['../views/sys/' + component + '.vue'], resolve);
                    }
                }
            }
            fmtRoutes.push(fmRouter)
        });
    }
    return fmtRoutes;
}